//+------------------------------------------------------------------+
//|                ChartObjectsFibo.mqh MQL5 斐波那契工具头文件       |
//|                版权所有 2000-2025, MetaQuotes Ltd.              |
//|                        官方网址: https://www.mql5.com            |
//+------------------------------------------------------------------+
//| 包含所有斐波那契技术分析工具类（回调线、时间区、扇形、弧线、通道、扩展） |
//+------------------------------------------------------------------+
#include "ChartObjectsLines.h"  // 引入趋势线基类 CChartObjectTrend（提供线型、锚点等基础功能）

//+------------------------------------------------------------------+
//| CChartObjectFibo 类（斐波那契回调线）                            |
//| 功能：MQL5 图表斐波那契回调线工具，用于标记价格趋势中的关键回调位     |
//| 继承关系：public CChartObjectTrend（基于趋势线基类，扩展斐波那契比例）|
//| 核心特性：                                                      |
//|  1. 2点定义趋势：通过“起点（趋势高点/低点）”和“终点（趋势低点/高点）”确定趋势段 |
//|  2. 自动生成比例线：按斐波那契比例（0.236、0.382、0.5、0.618、0.764等）生成水平回调线 |
//|  3. 用于趋势回调分析：判断价格回调至比例位时的支撑/阻力效果          |
//+------------------------------------------------------------------+
class CChartObjectFibo : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契回调线对象
    * @details 调用父类 CChartObjectTrend 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFibo(void);

   /**
    * @brief 析构函数：销毁斐波那契回调线对象
    * @details 依赖父类析构逻辑，自动删除图表上的回调线对象，释放资源
    */
                    ~CChartObjectFibo(void);

   /**
    * @brief 在指定图表创建斐波那契回调线（通过2个锚点定义趋势段）
    * @param chart_id [in] 目标图表 ID（0 表示当前图表，可通过 ChartID() 获取）
    * @param name [in] 回调线对象唯一名称（图表内不可重复）
    * @param window [in] 子窗口编号（0=主窗口，≥1=指标子窗口）
    * @param time1 [in] 第1个锚点的时间坐标（趋势起点对应的 K 线时间，如上升趋势的低点时间）
    * @param price1 [in] 第1个锚点的价格坐标（趋势起点价格，如上升趋势的低点价格）
    * @param time2 [in] 第2个锚点的时间坐标（趋势终点对应的 K 线时间，如上升趋势的高点时间）
    * @param price2 [in] 第2个锚点的价格坐标（趋势终点价格，如上升趋势的高点价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 锚点需按趋势方向排列（上升趋势：price1 < price2；下降趋势：price1 > price2），确保比例线生成正确
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2);

   /**
    * @brief 获取斐波那契回调线对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_FIBO，代表斐波那契回调线）
    */
   virtual int       Type(void) const { return(OBJ_FIBO); }
  };

//+------------------------------------------------------------------+
//| CChartObjectFiboTimes 类（斐波那契时间区）                        |
//| 功能：MQL5 图表斐波那契时间区工具，用于预测价格趋势的关键时间节点     |
//| 继承关系：public CChartObject（基于基础图表对象类，无趋势线依赖）    |
//| 核心特性：                                                      |
//|  1. 2点定义时间基准：通过“起点（关键时间）”和“终点（参考时间）”确定时间跨度 |
//|  2. 自动生成时间竖线：按斐波那契比例（1.0、1.618、2.618、4.236等）生成垂直时间线 |
//|  3. 用于时间周期分析：判断价格在比例时间点可能发生的趋势反转/加速      |
//+------------------------------------------------------------------+
class CChartObjectFiboTimes : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契时间区对象
    * @details 调用父类 CChartObject 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFiboTimes(void);

   /**
    * @brief 析构函数：销毁斐波那契时间区对象
    * @details 依赖父类析构逻辑，自动删除图表上的时间区对象，释放资源
    */
                    ~CChartObjectFiboTimes(void);

   /**
    * @brief 在指定图表创建斐波那契时间区（通过2个锚点定义时间跨度）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 时间区对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第1个锚点的时间坐标（时间基准起点，如趋势启动时间）
    * @param price1 [in] 第1个锚点的价格坐标（无实际意义，仅为兼容创建接口，可设为0）
    * @param time2 [in] 第2个锚点的时间坐标（时间基准终点，如趋势阶段性高点时间）
    * @param price2 [in] 第2个锚点的价格坐标（无实际意义，仅为兼容创建接口，可设为0）
    * @return bool - 操作结果：true 表示创建成功，false 表示失败
    * @note 时间区核心依赖 time1 和 time2 的时间差，price 参数不影响时间线生成
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2);

   /**
    * @brief 获取斐波那契时间区对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_FIBOTIMES，代表斐波那契时间区）
    */
   virtual int       Type(void) const { return(OBJ_FIBOTIMES); }
  };

//+------------------------------------------------------------------+
//| CChartObjectFiboFan 类（斐波那契扇形线）                          |
//| 功能：MQL5 图表斐波那契扇形线工具，用于标记价格趋势的动态支撑/阻力区域 |
//| 继承关系：public CChartObject（基于基础图表对象类，无趋势线依赖）    |
//| 核心特性：                                                      |
//|  1. 2点定义扇心与趋势：“起点”为扇心，“终点”确定基准趋势线方向       |
//|  2. 自动生成扇形射线：从扇心按斐波那契比例（0.236、0.382等）生成射线，形成扇形区域 |
//|  3. 用于趋势延续分析：判断价格沿扇形射线运动时的支撑/阻力强度        |
//+------------------------------------------------------------------+
class CChartObjectFiboFan : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契扇形线对象
    * @details 调用父类 CChartObject 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFiboFan(void);

   /**
    * @brief 析构函数：销毁斐波那契扇形线对象
    * @details 依赖父类析构逻辑，自动删除图表上的扇形线对象，释放资源
    */
                    ~CChartObjectFiboFan(void);

   /**
    * @brief 在指定图表创建斐波那契扇形线（通过2个锚点定义扇心与趋势）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 扇形线对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第1个锚点的时间坐标（扇心对应的 K 线时间，如趋势转折点时间）
    * @param price1 [in] 第1个锚点的价格坐标（扇心对应的价格，如趋势转折点价格）
    * @param time2 [in] 第2个锚点的时间坐标（基准趋势线终点时间，如趋势发展后的关键时间）
    * @param price2 [in] 第2个锚点的价格坐标（基准趋势线终点价格，如趋势发展后的关键价格）
    * @return bool - 操作结果：true 表示创建成功，false 表示失败
    * @note 第1个锚点为扇心，所有射线均从此点出发；第2个锚点决定扇形的“开口方向”
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2);

   /**
    * @brief 获取斐波那契扇形线对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_FIBOFAN，代表斐波那契扇形线）
    */
   virtual int       Type(void) const { return(OBJ_FIBOFAN); }
  };

//+------------------------------------------------------------------+
//| CChartObjectFiboArc 类（斐波那契弧线）                            |
//| 功能：MQL5 图表斐波那契弧线工具，用于标记价格趋势的弧形支撑/阻力位     |
//| 继承关系：public CChartObject（基于基础图表对象类，扩展弧线特有属性）|
//| 核心特性：                                                      |
//|  1. 2点定义弧线基准：“起点”和“终点”确定弧线的弦长与方向             |
//|  2. 缩放与形状控制：支持设置缩放比例（Scale）和椭圆开关（Ellipse），调整弧线曲率 |
//|  3. 自动生成比例弧线：按斐波那契比例生成多条弧线，形成弧形支撑/阻力带    |
//+------------------------------------------------------------------+
class CChartObjectFiboArc : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契弧线对象
    * @details 调用父类 CChartObject 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFiboArc(void);

   /**
    * @brief 析构函数：销毁斐波那契弧线对象
    * @details 依赖父类析构逻辑，自动删除图表上的弧线对象，释放资源
    */
                    ~CChartObjectFiboArc(void);

   //--- 弧线特有属性接口（缩放比例、椭圆形状）
   /**
    * @brief 获取弧线的缩放比例
    * @return double - 缩放比例（默认 1.0，值越大弧线越“平缓”，值越小弧线越“陡峭”）
    */
   double            Scale(void) const;

   /**
    * @brief 设置弧线的缩放比例
    * @param scale [in] 新缩放比例（建议范围 0.5~2.0，避免极端值导致弧线变形）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    */
   bool              Scale(const double scale) const;

   /**
    * @brief 获取弧线的椭圆形状开关状态
    * @return bool - 状态值：true=弧线按椭圆绘制（适应图表时间/价格轴比例），false=按正圆绘制（忽略轴比例）
    */
   bool              Ellipse(void) const;

   /**
    * @brief 设置弧线的椭圆形状开关
    * @param ellipse [in] 新状态（true=椭圆，false=正圆）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    * @note 建议开启椭圆模式（true），避免因时间/价格轴比例差异导致弧线失真
    */
   bool              Ellipse(const bool ellipse) const;

   /**
    * @brief 在指定图表创建斐波那契弧线（通过2个锚点+缩放比例定义）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 弧线对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第1个锚点的时间坐标（弧线起点时间，如趋势低点时间）
    * @param price1 [in] 第1个锚点的价格坐标（弧线起点价格，如趋势低点价格）
    * @param time2 [in] 第2个锚点的时间坐标（弧线终点时间，如趋势高点时间）
    * @param price2 [in] 第2个锚点的价格坐标（弧线终点价格，如趋势高点价格）
    * @param scale [in] 弧线缩放比例（建议初始设为 1.0，后续根据需求调整）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定+缩放设置完成），false 表示失败
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,const double scale);

   /**
    * @brief 获取斐波那契弧线对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_FIBOARC，代表斐波那契弧线）
    */
   virtual int       Type(void) const { return(OBJ_FIBOARC); }

   /**
    * @brief 将弧线参数（含特有属性）保存到文件
    * @param file_handle [in] 文件句柄（需提前以 FILE_WRITE 模式打开）
    * @return bool - 操作结果：true 表示保存成功，false 表示失败（文件无效/未绑定图表）
    * @note 保存内容：基类通用属性 + 缩放比例（Scale） + 椭圆开关（Ellipse）
    */
   virtual bool      Save(const int file_handle);

   /**
    * @brief 从文件加载弧线参数（含特有属性）
    * @param file_handle [in] 文件句柄（需提前以 FILE_READ 模式打开）
    * @return bool - 操作结果：true 表示加载成功，false 表示失败（文件无效/未绑定图表）
    */
   virtual bool      Load(const int file_handle);
  };

//+------------------------------------------------------------------+
//| CChartObjectFiboChannel 类（斐波那契通道）                        |
//| 功能：MQL5 图表斐波那契通道工具，用于标记价格趋势的通道式支撑/阻力区域 |
//| 继承关系：public CChartObjectTrend（基于趋势线基类，扩展通道结构）   |
//| 核心特性：                                                      |
//|  1. 3点定义通道：“起点”“趋势点”确定基准趋势线，“宽度点”确定通道宽度   |
//|  2. 自动生成比例通道：按斐波那契比例生成多条平行通道线，形成趋势通道   |
//|  3. 用于趋势跟踪：判断价格在通道内的运动规律，识别趋势延续/突破信号    |
//+------------------------------------------------------------------+
class CChartObjectFiboChannel : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契通道对象
    * @details 调用父类 CChartObjectTrend 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFiboChannel(void);

   /**
    * @brief 析构函数：销毁斐波那契通道对象
    * @details 依赖父类析构逻辑，自动删除图表上的通道对象，释放资源
    */
                    ~CChartObjectFiboChannel(void);

   /**
    * @brief 在指定图表创建斐波那契通道（通过3个锚点定义趋势与宽度）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 通道对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第1个锚点的时间坐标（通道起点时间，如趋势低点时间）
    * @param price1 [in] 第1个锚点的价格坐标（通道起点价格，如趋势低点价格）
    * @param time2 [in] 第2个锚点的时间坐标（基准趋势线终点时间，如趋势高点时间）
    * @param price2 [in] 第2个锚点的价格坐标（基准趋势线终点价格，如趋势高点价格）
    * @param time3 [in] 第3个锚点的时间坐标（通道宽度参考时间，如趋势调整点时间）
    * @param price3 [in] 第3个锚点的价格坐标（通道宽度参考价格，如趋势调整点价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 第1、2锚点确定通道“方向”，第3锚点确定通道“宽度”，需确保3点构成合理的趋势结构
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取斐波那契通道对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_FIBOCHANNEL，代表斐波那契通道）
    */
   virtual int       Type(void) const { return(OBJ_FIBOCHANNEL); }
  };

//+------------------------------------------------------------------+
//| CChartObjectFiboExpansion 类（斐波那契扩展线）                    |
//| 功能：MQL5 图表斐波那契扩展线工具，用于预测价格趋势的目标位（突破后）   |
//| 继承关系：public CChartObjectTrend（基于趋势线基类，扩展扩展结构）   |
//| 核心特性：                                                      |
//|  1. 3点定义扩展基准：“起点”“回调点”“趋势点”确定趋势段与回调比例      |
//|  2. 自动生成目标位线：按斐波那契扩展比例（1.0、1.618、2.618等）生成目标位线 |
//|  3. 用于目标位预测：判断价格突破原趋势后的潜在上涨/下跌目标位        |
//+------------------------------------------------------------------+
class CChartObjectFiboExpansion : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化斐波那契扩展线对象
    * @details 调用父类 CChartObjectTrend 构造函数，初始化基础属性（未绑定图表）
    */
                     CChartObjectFiboExpansion(void);

   /**
    * @brief 析构函数：销毁斐波那契扩展线对象
    * @details 依赖父类析构逻辑，自动删除图表上的扩展线对象，释放资源
    */
                    ~CChartObjectFiboExpansion(void);

   /**
    * @brief 在指定图表创建斐波那契扩展线（通过3个锚点定义扩展基准）
    * @param chart_id [in] 目标图表 ID
    * @param name [in] 扩展线对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第1个锚点的时间坐标（原趋势起点时间，如上升趋势低点时间）
    * @param price1 [in] 第1个锚点的价格坐标（原趋势起点价格，如上升趋势低点价格）
    * @param time2 [in] 第2个锚点的时间坐标（原趋势回调点时间，如上升趋势回调低点时间）
    * @param price2 [in] 第2个锚点的价格坐标（原趋势回调点价格，如上升趋势回调低点价格）
    * @param time3 [in] 第3个锚点的时间坐标（原趋势终点时间，如上升趋势高点时间）
    * @param price3 [in] 第3个锚点的价格坐标（原趋势终点价格，如上升趋势高点价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 3个锚点需按“趋势起点→回调点→趋势终点”的顺序排列，确保扩展比例计算符合趋势逻辑
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取斐波那契扩展线对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_EXPANSION，代表斐波那契扩展线）
    */
   virtual int       Type(void) const { return(OBJ_EXPANSION); }
  };
//+------------------------------------------------------------------+